iT邦幫忙

2021 iThome 鐵人賽

DAY 15
1
  • 之前我們看過用 Python 計算 Gradient 必須要手動計算偏微分之後,才有辦法算出
  • 那如果利用 Pytorch 呢?

一樣的前提假設

  • 我們一樣假設我們的目標 function 是 https://chart.googleapis.com/chart?cht=tx&chl=%24f(x)%20%3D%20w%20*%20x%24 ,今天希望找到正確的 w,然後我們的 loss function 一樣是 MSE https://chart.googleapis.com/chart?cht=tx&chl=%24(%5Chat%20y%20-%20y)%20%5E%202%24
  • 所以我們一樣得到我們的 function
    def forward(x):
    
        return w * x
    
  • 還有我們的 loss function
    def loss(y, y_predicted):
    
        return ((y_predicted-y) ** 2).mean() 
    
  • 原本我們用 python 去計算 Gradient 需要自己再寫一個 Gradient function,但是 Pytorch 不用,我們來看看怎麼用

Calculate Gradient

  • Pytorch 提供了 Autograd 來做 Gradient 的計算,而要計算 Gradient 必須要在參數創立時,開幾一個變數 requires_grad
    x = torch.randn(3, requires_grad=True)
    print(x)
    # tensor([-0.2124, -0.1003, -0.3773], requires_grad=True)
    
  • 那關於 Pytorch 在開啟 requires_grad 之後,會自動產生 Backward function 當他開始計算的過程中
    y = x + 2
    print(y)
    # tensor([1.7876, 1.8997, 1.6227], grad_fn=<AddBackward0>)
    z = y * y * 2
    # tensor([6.3911, 7.2174, 5.2663], grad_fn=<MulBackward0>)
    z = z.mean()
    print(z)
    # tensor(6.2916, grad_fn=<MeanBackward0>)
    
  • 我們從神經元的角度看待 https://chart.googleapis.com/chart?cht=tx&amp;chl=%24y%20%3D%20x%20%2B%202%24 ,Pytorch 在開啟 Autograd 之後,會自動在神經元 forward 運算時,建立一個 backward 的 gradient 運算

  • 所以當我們使用 torch.backward() 呼叫 backward calculate 時就等於計算了 dz/dx
    z.backward()
    print(x.grad)
    # tensor([2.3835, 2.5329, 2.1636])
    
  • 當我們要更新參數時,例如我們要更新我們的 weight,我們不需要他們產生 gradient function 了,因此我們需要一個沒有 Autograd 的環境,這邊有三種方式達到
    import torch
    
    x = torch.randn(3, requires_grad=True)
    print(x)
    # tensor([-0.2124, -0.1003, -0.3773], requires_grad=True)
    
    # using: x.requires_grad_(False)
    x.requires_grad_(False)
    print(x)
    # tensor([-0.2124, -0.1003, -0.3773])
    
    # using: x.detach()
    y = x.detach()
    print(y)
    # tensor([-0.2124, -0.1003, -0.3773])
    
    # using: with torch.no_grad():
    y = x + 2
    print(y)
    # tensor([1.7876, 1.8997, 1.6227], grad_fn=<AddBackward0>)
    with torch.no_grad():
        y = x + 2
        print(y)
        # tensor([1.7876, 1.8997, 1.6227])
    
  • 那 Pytorch 的 grad 運算是會疊加的,因此當你每個訓練的迴圈結束時,請記得淨空 grad,那如何淨空?
    x.grad.zero_()
    

每日小結

  • 大聲歡呼吧~我們原本手寫非常複雜的 gradient 在 Pytorch 眼中就是一個 function 啦~是不是輕鬆很多啊 XDD,這就是 Framework 的威力
  • 明天就讓我們直接看看一個簡單的 Regression Model 如果要訓練的話,用 Python 跟 Pytorch 的程式碼差異吧~

上一篇
Day-13 Pytorch Tensors
下一篇
Day-15 Pytorch 的 Regression 實作
系列文
Deep Learning 從零開始到放棄的 30 天 PyTorch 數字辨識模型31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言